home *** CD-ROM | disk | FTP | other *** search
/ InterCD 2000 December / december_2000.iso / Intercd / root / Multimedia / audio / ^NoiseTracker / NtkSourceCode / mod_import.cpp < prev    next >
Encoding:
Text File  |  2000-02-19  |  16.4 KB  |  686 lines

  1. //
  2. // MOD2NTK Conversor [aka "Adapter" =] routines v0.1b
  3. //
  4. // Currently loads: M.K.,M!K!,FLT4 & 4CHM modules.
  5. // [31 Instrument, 15 Instrument not supported]
  6. //
  7. // J. Arguelles
  8. //
  9.  
  10. void LoadAmigaMod(void)
  11. {
  12. SongStop();
  13. mess_box("Attempting to load the AMIGA-MOD module file...");
  14.  
  15. int t_hi;
  16. int t_lo;
  17.  
  18. Sleep(1000);    
  19. FILE *in;
  20. in = fopen(name,"rb");
  21.  
  22. if (in!=NULL)
  23. {
  24.  
  25. mess_box("Loading 'MOD' file -> Header");    
  26.  
  27. FreeAll();
  28.  
  29. for (int inicial=0;inicial<PBLEN;inicial+=6)
  30. {
  31.     *(RawPatterns+inicial)=121;//121
  32.     *(RawPatterns+inicial+1)=255;//255
  33.     *(RawPatterns+inicial+2)=255;//255
  34.     *(RawPatterns+inicial+3)=255;//255
  35.     *(RawPatterns+inicial+4)=0;//0
  36.     *(RawPatterns+inicial+5)=0;//0
  37. }
  38.  
  39. init_sample_bank();
  40. Iniplayer();
  41.  
  42. fread(name, sizeof( char ), 20,in);
  43.  
  44. mess_box("Loading 'MOD' file -> Sample data");    
  45.  
  46. for (int swrite=1;swrite<32;swrite++)
  47. {
  48. SampleType[swrite][0]=1;
  49. fread(&nameins[swrite], sizeof( char ), 19,in);
  50. sprintf(SampleName[swrite][0], "%s ",nameins[swrite]);
  51.  
  52. // Jump 3 unhandled bytes for NTK samplename.
  53. fseek(in,3,SEEK_CUR);
  54.  
  55. SampleNumSamples[swrite][0]=(int)fgetc(in)+(int)fgetc(in)*256;
  56. SampleNumSamples[swrite][0]*=2;
  57. fread(&Finetune[swrite][0], sizeof(char ),1,in);
  58. Finetune[swrite][0]*=16;
  59. CustomVol[swrite]=(float)fgetc(in)*0.015625f;
  60. SampleVol[swrite][0]=1.0f;
  61.  
  62. SampleType[swrite][0]=0; // NO SAMPLE
  63.  
  64. // Calculate/Adapt AMIGA loop points to ntk LoopPoints:
  65.  
  66. LoopStart[swrite][0]=((int)fgetc(in)+(int)fgetc(in)*256)*2;
  67. long Replen=((int)fgetc(in)+(int)fgetc(in)*256)*2;
  68.  
  69. if (Replen>2)
  70. {
  71. LoopEnd[swrite][0]=LoopStart[swrite][0]+Replen;
  72. LoopType[swrite][0]=1;
  73. }
  74. else
  75. {
  76. LoopEnd[swrite][0]=SampleNumSamples[swrite][0]-1;
  77. LoopType[swrite][0]=0;
  78. }
  79.  
  80. if(LoopEnd[swrite][0]>=SampleNumSamples[swrite][0])
  81. LoopEnd[swrite][0]=SampleNumSamples[swrite][0]-1;
  82.  
  83. // I dunno, but with some MOD files
  84. // I have to dec 1 position [sample] to the
  85. // start loop position to get correct looping points from MOD 
  86. // to NTK songs when LoopEnd equals to SampleLen-1 [?]
  87. // Maybe due to the NTK sampler archichecture.
  88. /*
  89. if(LoopEnd[swrite][0]==SampleNumSamples[swrite][0]-1)
  90. {
  91. LoopStart[swrite][0]--;
  92. if (LoopStart[swrite][0]<0)LoopStart[swrite][0]=0;
  93. }
  94. */
  95.  
  96. }// FOR
  97.  
  98. fread(&sLength, sizeof(unsigned char ), 1,in);
  99. fgetc(in);
  100.  
  101. // PATTERN PROGRESSION;
  102. nPatterns=1;
  103.  
  104. for (int tps=0;tps<128;tps++)
  105. {
  106. pSequence[tps]=fgetc(in);
  107. if(pSequence[tps]>=nPatterns)nPatterns=pSequence[tps]+1;
  108. patternLines[tps]=64;
  109. }
  110.  
  111. // JUMP THE HEADER
  112. fseek(in,4,SEEK_CUR);
  113.  
  114. mess_box("Loading 'MOD' file -> Converting patterns...");    
  115.  
  116. for (int pwrite=0;pwrite<nPatterns;pwrite++)
  117. {
  118. for (int li2=0;li2<64;li2++)
  119. {
  120. for (int pw2=0;pw2<4;pw2++)
  121. {
  122. int tmo=(pwrite*12288)+(li2*96)+(pw2*6);
  123. int f_byte=fgetc(in);
  124. int t_sample=f_byte/16;
  125. int t_period=(f_byte-(t_sample*16))*256+(int)fgetc(in);
  126. int t_byte=fgetc(in);
  127. int t_sample2=t_byte/16;
  128. int t_command=t_byte-(t_sample2*16);
  129. t_sample=t_sample*16+t_sample2;
  130. if (t_sample==0)t_sample=255;
  131.  
  132. int t_note=121;
  133. int t_argu=fgetc(in);
  134.  
  135. //Period Conversion Table
  136.  
  137. switch(t_period)
  138. {
  139. case 1712: t_note=1;break;
  140. case 1616: t_note=2;break;
  141. case 1524: t_note=3;break;
  142. case 1440: t_note=4;break;
  143. case 1356: t_note=5;break;
  144. case 1280: t_note=6;break;
  145. case 1208: t_note=7;break;
  146. case 1140: t_note=8;break;
  147. case 1076: t_note=9;break;
  148. case 1016: t_note=10;break;
  149. case 960: t_note=11;break;
  150. case 906: t_note=12;break;
  151. case 856: t_note=13;break;
  152. case 808: t_note=14;break;
  153. case 762: t_note=15;break;
  154. case 720: t_note=16;break;
  155. case 678: t_note=17;break;
  156. case 640: t_note=18;break;
  157. case 604: t_note=19;break;
  158. case 570: t_note=20;break;
  159. case 538: t_note=21;break;
  160. case 508: t_note=22;break;
  161. case 480: t_note=23;break;
  162. case 453: t_note=24;break;
  163. case 428: t_note=25;break;
  164. case 404: t_note=26;break;
  165. case 381: t_note=27;break;
  166. case 360: t_note=28;break;
  167. case 339: t_note=29;break;
  168. case 320: t_note=30;break;
  169. case 302: t_note=31;break;
  170. case 285: t_note=32;break;
  171. case 269: t_note=33;break;
  172. case 254: t_note=34;break;
  173. case 240: t_note=35;break;
  174. case 226: t_note=36;break;
  175. case 214: t_note=37;break;
  176. case 202: t_note=38;break;
  177. case 190: t_note=39;break;
  178. case 180: t_note=40;break;
  179. case 170: t_note=41;break;
  180. case 160: t_note=42;break;
  181. case 151: t_note=43;break;
  182. case 143: t_note=44;break;
  183. case 135: t_note=45;break;
  184. case 127: t_note=46;break;
  185. case 120: t_note=47;break;
  186. case 113: t_note=48;break;
  187. case 107: t_note=49;break;
  188. case 101: t_note=50;break;
  189. case 95: t_note=51;break;
  190. case 90: t_note=52;break;
  191. case 85: t_note=53;break;
  192. case 75: t_note=54;break;
  193. case 71: t_note=55;break;
  194. case 67: t_note=56;break;
  195. case 63: t_note=57;break;
  196. case 60: t_note=58;break;
  197. case 56: t_note=59;break;
  198. }
  199.  
  200. if (t_note!=121)t_note-=6;
  201.  
  202. *(RawPatterns+tmo)=t_note;
  203. *(RawPatterns+tmo+1)=t_sample;
  204.  
  205. // Pattern effect adapter:
  206.  
  207. switch(t_command)
  208. {
  209. // SPEED [not accurate]
  210. case 15:
  211.     if(t_argu>31)t_command=240;
  212.     else
  213.     switch(t_argu){
  214.     case 1:t_argu=16;break;
  215.     case 2:t_argu=12;break;
  216.     case 3:t_argu=8;break;
  217.     case 4:t_argu=6;break;
  218.     case 5:t_argu=5;break;
  219.     case 6:t_argu=4;break;
  220.     case 7:t_argu=3;break;
  221.     case 8:t_argu=3;break;
  222.     case 9:t_argu=3;break;
  223.     case 10:t_argu=3;break;
  224.     case 11:t_argu=3;break;
  225.     case 12:t_argu=2;break;
  226.     case 24:t_argu=1;break;}
  227. break;
  228.  
  229. // GLIDE
  230. case 3:
  231. t_command=5;
  232. break;
  233.  
  234. // VIBRATO [Not supported by NTK, ntk wansnt to sound like a violin :P ].
  235. case 4:
  236. t_command=0;
  237. t_argu=0;
  238. break;
  239.  
  240. // NO TREMOLO TOO
  241. case 6:
  242. t_command=0;
  243. t_argu=0;
  244. break;
  245.  
  246. // Volume Sliders
  247.  
  248. case 10:
  249. if(t_argu>=16)
  250. {
  251. t_command=25; // Vol SlideUp
  252. t_argu=(t_command-16)*2;
  253. }
  254. else
  255. {
  256. t_command=26; // Vol Slide Down
  257. t_argu*=2;
  258. }
  259.  
  260. break;
  261.  
  262. // Pattern Jump Amiga Mod stylee
  263. case 13:
  264.  
  265. t_hi=t_argu/16;
  266. t_lo=t_argu-t_hi*16;
  267. t_argu=t_hi*10+t_lo;
  268.  
  269. break;
  270.  
  271. // EXX Special Effects [no full implementation of all Protracker MOD Exx commands]
  272. case 14:
  273. t_command=0;
  274.  
  275. // FINEVOLUME SLIDEUP.
  276. if (t_argu>160 && t_argu<176)
  277. {
  278.     t_command=25;
  279.     t_argu=t_argu-160;
  280. }
  281.  
  282. // FINEVOLUME SLIDEDOWN.
  283. if (t_argu>176 && t_argu<192)
  284. {
  285.     t_command=26;
  286.     t_argu=t_argu-176;
  287. }
  288.  
  289. // NOTE RETRIGGER
  290. if (t_argu>144 && t_argu<160)
  291. {
  292.     t_command=14;
  293.     t_argu=t_argu-144;
  294. }
  295.  
  296. // NOTE CUT
  297. if (t_argu>192 && t_argu<208)*(RawPatterns+tmo+2)=t_argu-48;
  298. break;
  299.  
  300. // DEMOSYNCHRO SIGNAL???
  301. case 8:
  302. t_command=7;
  303. break;
  304.  
  305. // VOLUME 
  306. case 12:
  307. t_command=3;
  308. t_argu*=8;
  309. if(t_argu>255)t_argu=255;
  310. break;
  311. }// Pattern FX adapter end.
  312.  
  313. *(RawPatterns+tmo+4)=t_command;
  314. *(RawPatterns+tmo+5)=t_argu;
  315. }
  316. }
  317. }
  318.  
  319. mess_box("Loading 'MOD' file -> Loading/converting sample data...");    
  320.  
  321. for (swrite=1;swrite<32;swrite++)
  322. {
  323. if(SampleNumSamples[swrite][0]>8)
  324. {
  325. SampleChannels[swrite][0]=1;
  326. SampleType[swrite][0]=1;
  327.  
  328. // Reserving space for 16-Bit Signed Short Data.
  329.  
  330. RawSamples[swrite][0][0]=(short *)malloc((SampleNumSamples[swrite][0]*2));
  331. for (int x=0;x<SampleNumSamples[swrite][0];x++)
  332. *(RawSamples[swrite][0][0]+x)=(short)fgetc(in)*256;
  333. }
  334. else
  335. SampleType[swrite][0]=0; // NO SAMPLE
  336. }
  337.  
  338. //Track Properties:
  339.  
  340. // JEJE =] Stereo separation, with a little 'mono-feeling stuff added, no extrict panning:]'
  341. TPan[0]=0.1f;
  342. TPan[1]=0.9f;
  343. TPan[2]=0.8f;
  344. TPan[3]=0.2f;
  345. ComputeStereo(0);
  346. ComputeStereo(1);
  347. ComputeStereo(2);
  348. ComputeStereo(3);
  349.  
  350. BeatsPerMin=125;
  351. TicksPerBeat=4;
  352. mas_vol=0.75f;
  353. Songtracks=4;
  354. QUALITYPLAY=2; // <-----Hey, Amiga was in a great quality anyway! =]
  355. AMIMODE=true;
  356. fclose(in);
  357.  
  358. ped_track=0;
  359. ped_patsam=1;
  360. ped_row=0;
  361. ped_line=0;
  362. cPosition=0;
  363. gui_track=0;
  364. lchorus_counter=44100;
  365. rchorus_counter=44100;
  366. lchorus_counter2=44100-lchorus_delay;
  367. rchorus_counter2=44100-rchorus_delay;
  368. Initreverb();
  369.  
  370. Actualize_Sequencer();
  371. Actualize_Patterned();
  372. Actualize_Master(0);
  373. if(userscreen!=8)
  374. {userscreen=0;draw_mained();Actualize_Main_Ed();}
  375. mess_box("[AMIGAMOD] NTK Level 0 Song File loaded [Standard 16 Channel Mod, No Effects, Low CPU usage]");
  376. Actualize_Master(4);
  377. }
  378. else
  379. {
  380. mess_box("Module loading failed. (Probably: file not found)");
  381. }
  382.  
  383. if (snamesel==1 || snamesel==4 || snamesel==5)
  384. {
  385.     snamesel=0;
  386.     if(userscreen!=8)Actualize_Main_Ed();
  387. }
  388.  
  389. }
  390. void Actualize_303(char gode)
  391. {
  392.  
  393. if (gode==1) /* Copy 303 surface */
  394. S->copy(SKIN303,80,332,0,0,510,114);
  395. }
  396.  
  397. void draw_303ed(void)
  398. {
  399. guiDial(112,309,64,16,"Track FX",200);
  400. guiDial(178,309,64,16,"Midi/CSynth",200);
  401. guiDial(244,309,64,16,"Master",200);
  402. guiDial(310,309,64,16,"Sequencer",200);
  403. guiDial(376,309,64,16,"Disk IO",200);
  404. guiDial(442,309,64,16,"Track",200);
  405. guiDial(508,309,64,16,"Instrument",200);
  406. guiDial(574,309,64,16,"FX Setup",200);
  407. guiDial(640,309,64,16,"Extend Edit",200);
  408. guiDial(706,309,64,16,"303",100);
  409. guiDial2("303s Gear");
  410.  
  411. guiDial(8,346,64,16,"Reset Pat.",200);
  412. guiDial(8,364,64,16,"Clear Pat.",200);
  413. guiDial(8,382,64,16,"Rnd.NoteOn",200);
  414. guiDial(8,400,64,16,"Rand.Tones",200);
  415. guiDial(8,418,64,16,"Rand.Flags",200);
  416.  
  417. S->endDraw();
  418. S->copy(SKIN303,80,332,0,0,510,114);
  419. Actualize_303ed(0);
  420. }
  421.  
  422. void Actualize_303ed(char gode)
  423. {
  424.     S->endDraw();
  425.  
  426.     if(gode==0 || gode==1)number303(tb303[sl3].patternlength[tb303[sl3].selectedpattern],118,428);
  427.  
  428.     if(gode==0)
  429.     {
  430.     // Selected bassline
  431.     if(sl3)
  432.     {
  433.     Skincopy(578,413,138,119,3,3);
  434.     Skincopy(558,413,143,119,3,3);
  435.     }
  436.     else
  437.     {
  438.     Skincopy(558,413,138,119,3,3);
  439.     Skincopy(578,413,143,119,3,3);
  440.     }
  441.     number303(tbEditStep+1,486,358);
  442.     // Displaying pattern selection leds
  443.     // Bank [A-D]
  444.     int tbank303=tb303[sl3].selectedpattern/8;
  445.     tbank303*=15;
  446.     // Restoring background
  447.     S->copy(SKIN303,86,398,6,66,65,80);
  448.     // Light the bank
  449.     S->copy(SKIN303,87+tbank303,398,16+tbank303,117,28+tbank303,130);
  450.     // Displaying pattern selection leds
  451.     // Pattern [1-8]
  452.     int tpat303=tb303[sl3].selectedpattern-(tb303[sl3].selectedpattern/8)*8;
  453.     // Restoring background
  454.     S->copy(SKIN303,86,356,6,24,65,54);
  455.     // Light the bank
  456.     if(tpat303<4)
  457.     {
  458.     Skincopy(86+tpat303*15,356,75+tpat303*15,117,14,14);
  459.     }
  460.     else
  461.     {
  462.     tpat303-=4;
  463.     Skincopy(86+tpat303*15,371,75+tpat303*15,132,14,14);
  464.     }
  465.     }
  466.  
  467.     if(gode==0 || gode==2)
  468.     {
  469.     // Displaying waveform switch
  470.     if(tb303[sl3].waveform)
  471.     Skincopy(180,344,137,135,13,8);
  472.     else
  473.     Skincopy(180,344,137,125,13,8);
  474.     }
  475.  
  476.     // Draw 303 Knobs
  477.  
  478.     if(gode==0 || gode==3)knob1(229,348, tb303[sl3].tune/2);
  479.     if(gode==0 || gode==4)knob1(262,348, tb303[sl3].cutoff/2);
  480.     if(gode==0 || gode==5)knob1(295,348, tb303[sl3].resonance/2);
  481.     if(gode==0 || gode==6)knob1(328,348, tb303[sl3].envmod/2);
  482.     if(gode==0 || gode==7)knob1(361,348, tb303[sl3].decay/2);
  483.     if(gode==0 || gode==8)knob1(394,348, tb303[sl3].accent/2);
  484.  
  485.     if(gode==0 || gode==9){
  486.     // Restoring Notepad notebackground
  487.     Skincopy(200,387,120,55,162,34);
  488.     // Light Note
  489.     switch(tb303[sl3].tone[tb303[sl3].selectedpattern][tbEditStep])
  490.     {
  491.     case 0:Skincopy(208,415,138,119,3,3);break;
  492.     case 1:Skincopy(220,390,138,119,3,3);break;
  493.     case 2:Skincopy(229,415,138,119,3,3);break;
  494.     case 3:Skincopy(241,390,138,119,3,3);break;
  495.     case 4:Skincopy(250,415,138,119,3,3);break;
  496.     case 5:Skincopy(271,415,138,119,3,3);break;
  497.     case 6:Skincopy(283,390,138,119,3,3);break;
  498.     case 7:Skincopy(292,415,138,119,3,3);break;
  499.     case 8:Skincopy(304,390,138,119,3,3);break;
  500.     case 9:Skincopy(313,415,138,119,3,3);break;
  501.     case 10:Skincopy(325,390,138,119,3,3);break;
  502.     case 11:Skincopy(334,415,138,119,3,3);break;
  503.     case 12:Skincopy(355,415,138,119,3,3);break;
  504.     }
  505.     }
  506.  
  507.     if(gode==0 || gode==10){
  508.     // Light pause/note led
  509.     if(tb303[sl3].flag[tb303[sl3].selectedpattern][tbEditStep].pause)
  510.     {    
  511.     Skincopy(402,393,138,119,3,3);
  512.     Skincopy(439,393,143,119,3,3);
  513.     }
  514.     else
  515.     {    
  516.     Skincopy(402,393,143,119,3,3);
  517.     Skincopy(439,393,138,119,3,3);
  518.     }}
  519.  
  520.     if(gode==0 || gode==11)
  521.     {
  522.     // Light slide/off led
  523.     if(tb303[sl3].flag[tb303[sl3].selectedpattern][tbEditStep].slide_flag)
  524.     Skincopy(456,416,138,119,3,3);
  525.     else
  526.     Skincopy(456,416,143,119,3,3);
  527.     }
  528.  
  529.     if(gode==0 || gode==12)
  530.     {
  531.     // Light accent/off led
  532.     if(tb303[sl3].flag[tb303[sl3].selectedpattern][tbEditStep].accent_flag)
  533.     Skincopy(431,416,138,119,3,3);
  534.     else
  535.     Skincopy(431,416,143,119,3,3);
  536.     }
  537.  
  538.     if(gode==0 || gode==13)
  539.     {
  540.     // Transpose up flag
  541.     if(tb303[sl3].flag[tb303[sl3].selectedpattern][tbEditStep].transposeup_flag)
  542.     Skincopy(406,416,138,119,3,3);
  543.     else
  544.     Skincopy(406,416,143,119,3,3);
  545.     }
  546.  
  547.     // Transpose down flag
  548.  
  549.     if(gode==0 || gode==14)
  550.     {
  551.     if(tb303[sl3].flag[tb303[sl3].selectedpattern][tbEditStep].transposedown_flag)
  552.     Skincopy(381,416,138,119,3,3);
  553.     else
  554.     Skincopy(381,416,143,119,3,3);
  555.     }
  556.  
  557.     // Volume
  558.  
  559.     if(gode==0 || gode==15)
  560.     {
  561.     Skincopy(529,357,449,25,19,88);
  562.     int tb303v=f2i(tb303engine[sl3].tbVolume*74);
  563.     Skincopy(531,430-tb303v,1,116,14,12);
  564.     }
  565.  
  566.     if(gode==0 || gode==16)
  567.     {
  568.     // Light hpf led
  569.     if(tb303engine[sl3].hpf)
  570.     Skincopy(181,401,138,119,3,3);
  571.     else
  572.     Skincopy(181,401,143,119,3,3);
  573.     }
  574.  
  575. }
  576.  
  577. void number303(unsigned char number,int x,int y)
  578. {
  579.     switch(number)
  580.     {
  581.     case 0:S->copy(SKIN303,x,y,156,118,163,133);S->copy(SKIN303,x+8,y,156,118,163,133);break;
  582.     case 1:S->copy(SKIN303,x,y,156,118,163,133);S->copy(SKIN303,x+8,y,164,118,171,133);break;
  583.     case 2:S->copy(SKIN303,x,y,156,118,163,133);S->copy(SKIN303,x+8,y,172,118,179,133);break;
  584.     case 3:S->copy(SKIN303,x,y,156,118,163,133);S->copy(SKIN303,x+8,y,180,118,187,133);break;
  585.     case 4:S->copy(SKIN303,x,y,156,118,163,133);S->copy(SKIN303,x+8,y,188,118,195,133);break;
  586.     case 5:S->copy(SKIN303,x,y,156,118,163,133);S->copy(SKIN303,x+8,y,196,118,203,133);break;
  587.     case 6:S->copy(SKIN303,x,y,156,118,163,133);S->copy(SKIN303,x+8,y,204,118,211,133);break;
  588.     case 7:S->copy(SKIN303,x,y,156,118,163,133);S->copy(SKIN303,x+8,y,212,118,219,133);break;
  589.     case 8:S->copy(SKIN303,x,y,156,118,163,133);S->copy(SKIN303,x+8,y,220,118,227,133);break;
  590.     case 9:S->copy(SKIN303,x,y,156,118,163,133);S->copy(SKIN303,x+8,y,228,118,235,133);break;
  591.     case 10:S->copy(SKIN303,x,y,164,118,171,133);S->copy(SKIN303,x+8,y,156,118,163,133);break;
  592.     case 11:S->copy(SKIN303,x,y,164,118,171,133);S->copy(SKIN303,x+8,y,164,118,171,133);break;
  593.     case 12:S->copy(SKIN303,x,y,164,118,171,133);S->copy(SKIN303,x+8,y,172,118,179,133);break;
  594.     case 13:S->copy(SKIN303,x,y,164,118,171,133);S->copy(SKIN303,x+8,y,180,118,187,133);break;
  595.     case 14:S->copy(SKIN303,x,y,164,118,171,133);S->copy(SKIN303,x+8,y,188,118,195,133);break;
  596.     case 15:S->copy(SKIN303,x,y,164,118,171,133);S->copy(SKIN303,x+8,y,196,118,203,133);break;
  597.     case 16:S->copy(SKIN303,x,y,164,118,171,133);S->copy(SKIN303,x+8,y,204,118,211,133);break;
  598.     }
  599. }
  600.  
  601. void Skincopy(int xd,int yd,int xs,int ys,int w,int h)
  602. {
  603. S->copy(SKIN303,xd,yd,xs,ys,xs+w,ys+h);
  604. }
  605.  
  606. void knob1(int x, int y, unsigned char number)
  607. {
  608. if(number>62)number=62;
  609. S->copy(KNOB1,x,y,number*25,0,number*25+24,24);
  610. }
  611.  
  612. void LoadRebirthMod(void)
  613. {
  614. mess_box("Importing 303 data from .RBS Propellerhead's Rebith v2.0 song file...");
  615. FILE *in;
  616. in = fopen(name,"rb");
  617.  
  618. if (in!=NULL)
  619. {
  620.  
  621. mess_box("Loading 'RBS' file -> 303Data");
  622.  
  623. fseek(in,1676,SEEK_SET);
  624. fread(&tb303[0].enabled,sizeof (char),1,in);
  625. fread(&tb303[0].selectedpattern,sizeof (char),1,in);
  626. fread(&tb303[0].tune,sizeof (char),1,in);
  627. fread(&tb303[0].cutoff,sizeof (char),1,in);
  628. fread(&tb303[0].resonance,sizeof (char),1,in);
  629. fread(&tb303[0].envmod,sizeof (char),1,in);
  630. fread(&tb303[0].decay,sizeof (char),1,in);
  631. fread(&tb303[0].accent,sizeof (char),1,in);
  632. fread(&tb303[0].waveform,sizeof (char),1,in);
  633.  
  634. for(char rn=0;rn<32;rn++)
  635. {
  636.     fseek(in,1,SEEK_CUR);// Jump unhandled 'shuffle'
  637.  
  638.     fread(&tb303[0].patternlength[rn],sizeof (char),1,in);
  639.  
  640.     for(char rn2=0;rn2<16;rn2++)
  641.     {
  642.     fread(&tb303[0].tone[rn][rn2],sizeof (char),1,in);
  643.     fread(&tb303[0].flag[rn][rn2],sizeof (char),1,in);
  644.     tb303[0].flag[rn][rn2].pause=!tb303[0].flag[rn][rn2].pause;
  645.     }
  646. }
  647.  
  648. // Second bassline:
  649.  
  650. fseek(in,2782,SEEK_SET);
  651. fread(&tb303[1].enabled,sizeof (char),1,in);
  652. fread(&tb303[1].selectedpattern,sizeof (char),1,in);
  653. fread(&tb303[1].tune,sizeof (char),1,in);
  654. fread(&tb303[1].cutoff,sizeof (char),1,in);
  655. fread(&tb303[1].resonance,sizeof (char),1,in);
  656. fread(&tb303[1].envmod,sizeof (char),1,in);
  657. fread(&tb303[1].decay,sizeof (char),1,in);
  658. fread(&tb303[1].accent,sizeof (char),1,in);
  659. fread(&tb303[1].waveform,sizeof (char),1,in);
  660.  
  661. for(rn=0;rn<32;rn++)
  662. {
  663.     fseek(in,1,SEEK_CUR);// Jump unhandled 'shuffle'
  664.  
  665.     fread(&tb303[1].patternlength[rn],sizeof (char),1,in);
  666.  
  667.     for(char rn2=1;rn2<16;rn2++)
  668.     {
  669.     fread(&tb303[1].tone[rn][rn2],sizeof (char),1,in);
  670.     fread(&tb303[1].flag[rn][rn2],sizeof (char),1,in);
  671.     tb303[1].flag[rn][rn2].pause=!tb303[1].flag[rn][rn2].pause;
  672.     }
  673. }
  674.  
  675. mess_box("Rebirth v2.0 303 Data loaded...");
  676.  
  677. if(userscreen==9){S->endDraw();Actualize_303ed(0);}
  678.  
  679. fclose(in);
  680. }
  681. else
  682. {
  683. mess_box("File load failed...");    
  684. }
  685.  
  686. }